<?php

namespace App\Http\Controllers\Admin\UserManager;

use App\Jobs\QiPao\ExcelJob;
use App\Exceptions\BasicException;
use App\Http\Controllers\BaseController;
use App\Services\Tools\ExportService;
use App\Services\Tools\HelperService;
use Illuminate\Http\Request;

//引用http请求类
use App\Response\Response;
use App\Repositories\RoomAccountRepository;

class AdminRechargeController extends BaseController
{
    /**
     * @api {get} /user-manager/admin-recharge 管理员充值记录
     * @apiVersion 0.1.0
     * @apiName 会员管理-管理员充值记录
     * @apiGroup 会员管理
     * @apiParam {string} start_time 开始日期
     * @apiParam {string} end_time   结束日期
     * @apiParam {number} page 当前页数 可选
     * @apiParam {number} perPage 分页容量 可选
     * @apiParam {number} type 充值类型：0（默认）：不限制；1：余额；2：收益；3：特殊币；
     * @apiParam {number} purpose 充值目的，0（默认）：不限制；1：测试费用；2：24小时奖励；3：公会周奖励；4：公会月奖励；5：账号冲正；6：其它
     * @apiParam {number} admin_id 管理员id
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * "list": [
     * {
     * "id": 1,
     * "add_time": "2021-03-04 18:24:06", (时间)
     * "type": 3, （类型）
     * "gold": 1,  （充值金额）
     * "user_id": 642972, （用户id）
     * "nickname": "心咏思516448",  （用户名称）
     * "admin_name": "admin",  （管理员名称）
     * "type_name": "特殊币" （类型名称）
     * "remark（充值备注）": "充值测试" （充值备注）
     * "purpose_desc（充值目的描述）": "测试费用" （充值目的描述）
     * }
     * ],
     * "meta": {
     * "page": 1,
     * "limit": 10,
     * "next": null,
     * "total": 1
     * }
     * }
     * }
     */
    public function list(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'start_time' => 'filled|string|date_format:"Y-m-d"',
                'end_time'   => 'filled|string|date_format:"Y-m-d"',
                'perPage'    => 'filled|numeric',
                'page'       => 'filled|numeric',
                'type'       => 'filled|integer|in:0,1,2,3',
                'admin_id'   => 'filled|numeric',
                'purpose'   => 'filled|integer|in:0,1,2,3,4,5,6',
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }

        $list = app('repo_admin_recharge')->getAdminRechargeQueryList($request->input());

        return Response::sendList($list);
    }

    /**
     * @api {get} /user-manager/admin-recharge/export/excel 管理员充值记录-导出
     * @apiVersion 0.1.0
     * @apiName  会员管理-管理员充值记录-导出
     * @apiGroup 会员管理
     * @apiParam {string} start_time 开始日期
     * @apiParam {string} end_time   结束日期
     * @apiParam {number} page 当前页数 可选
     * @apiParam {number} perPage 分页容量 可选
     * @apiParam {number} type 充值类型：1余额2收益3特殊币 可选
     * @apiParam {number} purpose 充值目的，0（默认）：不限制；1：测试费用；2：24小时奖励；3：公会周奖励；4：公会月奖励；5：账号冲正；6：其它
     * @apiParam {number} admin_id 管理员id
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * "download_url": "asdasdasd.com"
     * }
     */
    public function export(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'start_time' => 'filled|string|date_format:"Y-m-d"',
                'end_time'   => 'filled|string|date_format:"Y-m-d"',
                'type'       => 'filled|integer|in:0,1,2,3',
                'admin_id'   => 'filled|numeric',
                'purpose'   => 'filled|integer|in:0,1,2,3,4,5,6',
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }


        $params = $request->input();
        $params['page'] = 1;
        $params['perPage'] = 10000;
        $list = app('repo_admin_recharge')->getAdminRechargeQueryList($params);

        $roomAccountRepository = new RoomAccountRepository();
        $result = [];
        if ($list) {
            foreach ($list as $item) {
                //处理昵称中的emoji表情，防止导出excel错误
                $nickname = HelperService::wxNickNameFormat($item->nickname);
                $temp = [
                    $nickname,
                    $item->user_code,
                    $item->gold,
                    $item->type_name,
                    $item->admin_name,
                    $item->add_time,
                    $item->purpose_desc,
                    $item->remark,
                ];

                $result[] = $temp;
            }
        }

        $headings = [
            '用户昵称',
            '用户编号',
            '充值金额',
            '充值类型',
            '管理员名称',
            '时间',
            '充值目的',
            '备注',
        ];

        return app('repo_export')->export(2, $request->all(), $headings, $result);
    }


    /**
     * @api {get} /user-manager/admin-recharge/export/excel/async 管理员充值记录-异步导出
     * @apiVersion 0.1.0
     * @apiName  会员管理-管理员充值记录-导出
     * @apiGroup 会员管理
     * @apiParam {string} start_time 开始日期
     * @apiParam {string} end_time   结束日期
     * @apiParam {number} type 充值类型：1余额2收益3特殊币 可选
     * @apiParam {number} purpose 充值目的，0（默认）：不限制；1：测试费用；2：24小时奖励；3：公会周奖励；4：公会月奖励；5：账号冲正；6：其它
     * @apiParam {number} admin_id 管理员id
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * }
     */
    public function exportAsync(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'start_time' => 'filled|string|date_format:"Y-m-d"',
                'end_time'   => 'filled|string|date_format:"Y-m-d"',
                'type'       => 'filled|integer|in:0,1,2,3',
                'admin_id'   => 'filled|numeric',
                'purpose'   => 'filled|integer|in:0,1,2,3,4,5,6',
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }

        $params = $request->only(['start_time', 'end_time', 'type', 'admin_id', 'purpose']);

        $data = [
            'admin_id'     => $request->admin_id ?? '',
            'data_no'      => 2,//ExportEnum::NO
            'condition'    => json_encode($params) ?? '',
            'status'       => 0,//正在导出
            'title'        => '管理员充值纪录 异步导出',//正在导出
            'download_url' => '',
        ];
        $exportLogId = app('model_admin_export_log')->insertGetId($data);
        $excel = new ExcelJob($exportLogId, $request->admin_id, 2, $params);
        // 标记导出程序开始运行
        dispatch($excel)->onQueue(env('RABBITMQ_QUEUE_EXCEL'));                      //推送到指定队列

        return Response::sendData('');
    }


    /**
     * @api {post} /user-manager/admin-recharge/remark 设置管理员充值备注
     * @apiVersion 3.0.1
     * @apiName  设置管理员充值备注
     * @apiGroup 会员管理
     * @apiParam {int} id
     * @apiParam {string} remark  备注
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * }
     */
    public function setRachargeRemark(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'id'     => 'required|integer|min:1',
                'remark' => 'required|string|max:200',
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }


        $params = $request->only(['id', 'remark',]);
        $res = app('model_admin_recharge')->where('id', $params['id'])->update(['remark' => $params['remark']]);
        if ($res) {
            return Response::sendData('');
        } else {
            throw new BasicException(10001, '修改失败');
        }
    }

    /**
     * @api {get} /user-manager/admin-give-gift 查看管理员送礼纪录
     * @apiVersion 3.0.1
     * @apiName  查看管理员送礼纪录
     * @apiGroup 会员管理
     * @apiParam {string} start_time 开始日期 选填 Y-m-d H:i:s
     * @apiParam {string} end_time   结束日期 选填
     * @apiParam {integer} perPage   页面尺寸  选填
     * @apiParam {integer} page    页码 选填
     * @apiParam {string} nickname    用户昵称 选填
     * @apiParam {integer} user_code    用户编号 选填
     * @apiParam {string} name    礼物名称 选填
     * @apiParam {integer} admin_id 管理员id 选填
     * @apiParam {integer} sort 价格排序  1升 2降 选填 不填按时间倒叙
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * "list": [
     * {
     * "id": 1,
     * "user_code（用户编码）": 9774544,
     * "nickname（用户昵称）": "小气泡9774544",
     * "name（礼物名称）": "菠萝汽水",
     * "price（礼物单价）": 5200,
     * "num（礼物数量）": 2,
     * "admin_name（管理员名称）": "admin",
     * "remark（送礼备注）": "测试",
     * "created_by（送礼时间）": "2021-11-19 14:48:08"
     * }
     * ],
     * "meta": {
     * "page": 1,
     * "limit": 10,
     * "next": null,
     * "total": 1
     * }
     * }
     * }
     */
    public function getAdminGiveGift(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'start_time' => 'filled|string|date_format:"Y-m-d H:i:s"',
                'end_time'   => 'filled|string|date_format:"Y-m-d H:i:s"',
                'perPage'    => 'filled|numeric',
                'page'       => 'filled|numeric',
                'nickname'   => 'filled|string',
                'user_code'  => 'filled|numeric',
                'name'       => 'filled|string',
                'admin_id'   => 'filled|numeric',
                'sort'       => 'filled|in:1,2',//价格排序 1升 2降可不填
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }


        $list = app('repo_admin_recharge')->getAdminGiveGiftList($request->input());

        return Response::sendList($list);
    }

    /**
     * @api {put} /user-manager/admin-give-gift/remark 修改管理员送礼备注
     * @apiVersion 3.0.1
     * @apiName  修改管理员送礼备注
     * @apiGroup 会员管理
     * @apiParam {integer} id    页码 必填
     * @apiParam {string} remark    送礼备注 必填
     * @apiSuccessExample 成功响应
     * {
     * "code": 200,
     * "data": {
     * }
     */
    public function setAdminGiveGiftRemark(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'id'     => 'required|integer|min:1',
                'remark' => 'required|string|max:200',
            ]);
        if ($v->fails()) {
            throw new BasicException(10001, $v->errors()->first());
        }

        $res = app('model_admin_give_gift')->where('id', $request->id)->update(['remark' => $request->remark]);
        if ($res) {
            return Response::sendData(true);
        } else {
            throw new BasicException(10001, '备注修改失败');
        }
    }
}
